// 引入接口方法用于在effects中编写所需的业务逻辑

function queryCurrent({ name }: any) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve({ id: 1, name })
        }, 1000);
    })
}


// 实际上只是按规则定义一个配置对象
const UserModel = {
    // 当前 Model 的名称。整个应用的 State，由多个小的 Model 的 State 以 namespace 为 key 合成
    namespace: 'user',
    // 该 Model 当前的状态。数据保存在这里，直接决定了视图层的输出
    state: {
        currentUser: {}
    },
    // Action 处理器，处理异步动作，基于 Redux-saga 实现。Effect 指的是副作用。根据函数式编程，计算以外的操作都属于 Effect，典型的就是 I/O 操作、数据库读写。
    effects: { // vuex action
        // Effect 是一个 Generator 函数，内部使用 yield 关键字，标识每一步的操作（不管是异步或同步）。
        *fetchCurrentUser({ payload, callback }: any, { call, put }: any) {
            // (外部传递的参数, 自身的方法)
            // payload 参数  callback 成功的回调
            // call 执行异步函数用的  call(异步函数,函数参数)
            // put 用来派发 reducers
            // 执行异步函数
            console.log(payload, 'payload')
            const response = yield call(queryCurrent, { name: "bbb" })
            if (response.id) {
                const { id, name } = response
                if (callback) {
                    callback({ id, name })
                }
                // 发出一个 Action，类似于 dispatch
                yield put({
                    type: 'saveCurrentUser',
                    payload: { id, name }
                })
            }
        }
    },
    // Reducer 是 Action 处理器，用来处理同步操作，可以看做是 state 的计算器。它的作用是根据 Action，从上一个 State 算出当前 State。
    reducers: { // vuex mutations
        saveCurrentUser(state, { payload = {} }) {
            return {
                ...state,
                currentUser: payload
            }
        }
    }

}

export default UserModel;
